iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 20
0

在 JavaScript 和 TypeScript 中,物件不能直接相比較。所以,如果要複製物件也不能直接使用一個等號複製過去。

就在昨天學到了關於 比較 的雷區之後,今天忍不住找到了另一個雷區,就是關於物件的雷區。關於物件,如果我們把一個物件 assign 一個變數,這個變數所儲存並不是這個物件的值,而是這個物件的參考,也就是說,這兩個變數會指向同一個變數,要小心。

來看的範例吧:

let foo = [1 , 2, 3];
let bar = foo; // 這時候 bar 和 foo 都同時指向 [1, 2, 3]
// 這時候
//    foo 會是 [1, 2, 3]
//    bar 也是 [1, 2, 3]

foo.push(9527);
// 這時候
//    foo 會是 [1, 2, 3, 9527]
//    bar 也是 [1, 2, 3, 9527]

雖然我們是 push 9527foo 裡面,但因為 foobar 都是指到同一個存放 [1, 2, 3] 的位置,所以不管我對 foo 做什麼事情,bar 也同時會被影響!所以要很小心!

這時候因為他們是存參考位置,所以如果我們去比較這兩個變數(foo, bar),他就會是相等的。

foo === bar // true

現在應該知道為什麼物件不能直接比了吧!這個就是跟 比較 的雷區是有相關的!

那如果要複製該怎麼做呢?可以使用 Object.create 來完成。

foo = Object.create(bar);

這樣一來, foobar 的內容就會相同,但又不會是同一個物件了。


上一篇
第19天 - "比較" 的雷區
下一篇
第 21 天- Union Types
系列文
從零開始進入 JavaScript & TypeScript 的世界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言